#include <iostream>
#include <fstream>
#include <string>
using std::cout;
using std::endl;
using std::cerr;
using std::string;
using std::ifstream;

//文件输入流：外部的文件流向内存
//外部的文件有可能是不存在的，如果不存在则会导致流的状态异常
//所以在使用文件输入流的时候，那么一定需要考虑到流的状态
//构建ifstream对象，有两种方式
//1.使用无参构造函数，先创建ifstream对象
//文件输入流对象和文件进行关联操作
//2.使用有参构造函数，直接和文件进行关联操作
void test(){
    //1.方式1
    ifstream ifs;
    ifs.open("hello.txt");
    if(!ifs.good()){
        cerr << "the file is not ready" << endl;
    }

    //方式2:
    ifstream ifs2("hello.txt");
    if(!ifs2.good()){
        cerr << "the file is not ready" << endl;
    }
}

//使用>>运算符可以每次处理一个单词
//但是如果我们只是为了打印输出或者有的场景可能需要一次
//处理一行，那么可以使用test3里面的函数
void test2(){
    ifstream ifs("hello.txt");
    if(!ifs.good()){
        cerr << "the file is not ready" << endl;
    }
    string word;
    //每次读取缓冲区里面的一个字符，写入到word中
    //ifs >> word;
    //为什么可以这么去写？主要的原因在于
    //ifs >> word之后返回值依然是ifs对象本身
    //将ifs置于if、while等条件判断语句中，会隐式
    //转换为bool类型
    while(ifs >> word){
        cout << word << endl;
    }
}

//读取输入流缓冲区中一行的数据，然后将其写入到一个单词中
void test3(){
    ifstream ifs("hello.txt");
    if(!ifs.good()){
        cerr << "this file is not found" << endl;
        return;
    }
    //为什么可以这么写呢？
    //getline的返回值是ifstream对象本身
    //将ifstream置于while条件中，会进行隐式类型转换
    //为bool类型，判断是否是fail或者eof
    string line;
    while(getline(ifs, line)){
        cout << line << endl;
    }
}

int main()
{
    test3();
    return 0;
}

